home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / ip / ka9q / src.arc / TCPDUMP.C < prev    next >
C/C++ Source or Header  |  1989-08-19  |  2KB  |  71 lines

  1. #include <stdio.h>
  2. #include "global.h"
  3. #include "mbuf.h"
  4. #include "netuser.h"
  5. #include "internet.h"
  6. #include "timer.h"
  7. #include "tcp.h"
  8. #include "ip.h"
  9. #include "trace.h"
  10.  
  11. /* TCP segment header flags */
  12. static char *Tcpflags[] = {
  13.     "FIN",    /* 0x01 */
  14.     "SYN",    /* 0x02 */
  15.     "RST",    /* 0x04 */
  16.     "PSH",    /* 0x08 */
  17.     "ACK",    /* 0x10 */
  18.     "URG"    /* 0x20 */
  19. };
  20.  
  21. /* Dump a TCP segment header. Assumed to be in network byte order */
  22. void
  23. tcp_dump(bpp,source,dest,check)
  24. struct mbuf **bpp;
  25. int32 source,dest;    /* IP source and dest addresses */
  26. int check;        /* 0 if checksum test is to be bypassed */
  27. {
  28.     struct tcp seg;
  29.     struct pseudo_header ph;
  30.     int16 csum;
  31.  
  32.     if(bpp == NULLBUFP || *bpp == NULLBUF)
  33.         return;
  34.  
  35.     /* Verify checksum */
  36.     ph.source = source;
  37.     ph.dest = dest;
  38.     ph.protocol = TCP_PTCL;
  39.     ph.length = len_mbuf(*bpp);
  40.     csum = cksum(&ph,*bpp,ph.length);
  41.  
  42.     ntohtcp(&seg,bpp);
  43.  
  44.     printf("TCP: %u->%u Seq x%lx",seg.source,seg.dest,seg.seq,seg.ack);
  45.     if(seg.flags.ack)
  46.         printf(" Ack x%lx",seg.ack);
  47.     if(seg.flags.urg)
  48.         printf(" %s",Tcpflags[5]);
  49.     if(seg.flags.ack)
  50.         printf(" %s",Tcpflags[4]);
  51.     if(seg.flags.psh)
  52.         printf(" %s",Tcpflags[3]);
  53.     if(seg.flags.rst)
  54.         printf(" %s",Tcpflags[2]);
  55.     if(seg.flags.syn)
  56.         printf(" %s",Tcpflags[1]);
  57.     if(seg.flags.fin)
  58.         printf(" %s",Tcpflags[0]);
  59.  
  60.     printf(" Wnd %u",seg.wnd);
  61.     if(seg.flags.urg)
  62.         printf(" UP x%x",seg.up);
  63.     /* Print options, if any */
  64.     if(seg.mss != 0)
  65.         printf(" MSS %u",seg.mss);
  66.     if(check && csum != 0)
  67.         printf(" CHECKSUM ERROR (%u)",csum);
  68.     printf("\n");
  69. }
  70.  
  71.